const { Model } = require("sequelize")
const sequelize = require("../../common/sequelize")
const studentSchema = require("./studentSchema")
const Class = require('../Class')
const { Op } = require("sequelize");


class Student extends Model {
  /**
   * @description 传入用户的唯一id，可以返回对应学生所有信息（包含班级信息）
   * @param {string} id 学生用户的唯一id
   * @returns  返回一个包含学生各类信息的数据集
   */
  static async getInfoById(id) {
    const res = (await this.findOne({
      where: { UserId: id },
      include: [{
        model: Class,
        attributes: {
          exclude: ['id', 'total', 'createdAt']
        }
      }],
      attributes: { exclude: ['id', 'UserId', 'ClassId'] }
    })).dataValues

    if (res) {
      const classRes = res.Class.dataValues
      delete res.Class.dataValues
      return Object.assign(res, { classname: classRes.classname })
    }
    return null
  }


  /**
   * @description 可以通过传入一个对象设置过滤对象，查询符合条件的学生信息；目前支持过滤的字段：grades(学生年级),schools(学生就读学校),ClassIds(学生所在班级)。
   * 传入空对象会将整个学生表的结果返回
   * 使用举例：
   *      - 传入参数:{grades:['2018']}
   *        查询结果:所有年级为2018级的学生
   *      - 传入参数:{grades:['2018'],schools:['东理']}
   *        查询结果:所有年级为2018级且就读学校为东理的学生
   *      - 传入参数:{grades:['2018'],schools:['东理','财大']}
   *        查询结果:所有在东理或者财大的且年级为2018级的学生
   * 
   * @param {Object}  用于筛选用户信息的条件
   * @returns {Array} 包含查询结果数据集的数组
   */
  static async getStudentsInfo({ grades, schools, ClassIds }) {
    let where = []
    if (grades) {
      let opArr = []
      grades.forEach(grade => {
        opArr.push({ grade })
      })
      where.push(opArr)
    }
    if (schools) {
      let opArr = []

      schools.forEach(school => {
        opArr.push({ school })
      })
      where.push(opArr)

    }
    if (ClassIds) {
      let opArr = []


      ClassIds.forEach(ClassId => {
        opArr.push({ ClassId })
      })
      where.push(opArr)

    }


    let andOpt = []
    where.forEach(el => {
      let orOpt = []
      el.forEach(e => {
        orOpt.push(e)
      })
      andOpt.push({ [Op.or]: orOpt })
    })


    const res = await this.findAll({
      where: {
        [Op.and]: andOpt
      },
      attributes: {
        exclude: ['ClassId', 'id']
      },
      instance: true,
      include: [{
        model: Class,
        attributes: ['id', 'classname']
      }],

    })
    let results = []
    res.forEach(el => {
      results.push(el.get({ plain: true }))
    })
    return results
  }
}


// 初始化Students模型
Student.init(studentSchema, {
  sequelize,
  modelName: 'Student',
  tableName: 'students',
  updatedAt: false
});
module.exports = Student
